import bcrypt
import datetime
from functools import wraps
from flask import request, jsonify, g
from flask_jwt_extended import verify_jwt_in_request, get_jwt_identity
from app import mongo
from bson import ObjectId

def hash_password(password):
    """对密码进行哈希处理"""
    return bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')

def check_password(password, hashed):
    """验证密码是否匹配"""
    return bcrypt.checkpw(password.encode('utf-8'), hashed.encode('utf-8'))

def permission_required(permission):
    """检查用户是否具有特定权限的装饰器"""
    def decorator(fn):
        @wraps(fn)
        def wrapper(*args, **kwargs):
            # 验证JWT令牌
            verify_jwt_in_request()
            
            # 获取用户身份
            user_id = get_jwt_identity()
            
            # 查询用户
            user = mongo.db.users.find_one({'_id': ObjectId(user_id)})
            if not user:
                return jsonify({'success': False, 'message': '用户不存在'}), 401
            
            # 获取用户的角色
            role_name = user.get('role')
            if not role_name:
                return jsonify({'success': False, 'message': '用户没有角色'}), 403
            
            # 查询角色
            role = mongo.db.roles.find_one({'name': role_name})
            if not role:
                return jsonify({'success': False, 'message': '角色不存在'}), 403
            
            # 获取角色权限
            permissions = role.get('permissions', [])
            
            # 将权限保存到g对象中，供视图函数使用
            g.user_permissions = permissions
            
            # 检查是否有所需权限
            if permission in permissions:
                # 将用户信息存储在g对象中，供视图函数使用
                g.current_user = user
                return fn(*args, **kwargs)
            
            return jsonify({'success': False, 'message': '权限不足'}), 403
        return wrapper
    return decorator

def role_required(role_names):
    """检查用户是否具有特定角色的装饰器"""
    def decorator(fn):
        @wraps(fn)
        def wrapper(*args, **kwargs):
            # 验证JWT令牌
            verify_jwt_in_request()
            
            # 获取用户身份
            user_id = get_jwt_identity()
            
            # 查询用户
            user = mongo.db.users.find_one({'_id': ObjectId(user_id)})
            if not user:
                return jsonify({'success': False, 'message': '用户不存在'}), 401
            
            # 获取用户的角色
            role = user.get('role')
            
            # 如果role_names是字符串，将其转换为列表
            if isinstance(role_names, str):
                role_names = [role_names]
            
            # 检查用户角色是否在允许的角色列表中
            if role in role_names:
                # 将用户信息存储在g对象中，供视图函数使用
                g.current_user = user
                return fn(*args, **kwargs)
            
            return jsonify({'success': False, 'message': '权限不足'}), 403
        return wrapper
    return decorator 